home *** CD-ROM | disk | FTP | other *** search
/ Mac Format 1997 July / macformat52.iso / mac / Shareware Plus / Developers / MacFloater Folder / read me first! < prev   
Text File  |  1997-04-24  |  6KB  |  135 lines

  1. Macintosh Floating Windows Library
  2.  
  3. William Edward Woody
  4. In Phase Consulting
  5. 1545 Ard Eevin Avenue
  6. Glendale, CA 91202
  7. woody@alumni.caltech.edu
  8.  
  9.  
  10. What is it?
  11.  
  12. The Macintosh Floating Windows Library is a collection of routines I hacked together, based on a Develop magazine article, which helps provide floating windows support.
  13.  
  14. What does it come with?
  15.  
  16. This comes with two files, MacFloater.c and MacFloater.h. These two routines implement floating-window versions of the following routines:
  17.  
  18. • WindowPtr  MFrontWindow(void)
  19.  
  20. Replaces FrontWindow; returns the frontmost non-floating window.
  21.  
  22. • WindowPtr MLastFloater(void)
  23.  
  24. This has no MacOS API equivalent. This returns the bottommost floating window, if one exists.
  25.  
  26. • void MSelectWindow(WindowPtr)
  27.  
  28. Replaces SelectWindow(); selects the specified window. Also works with floating windows, by bringing the specified floating window to the front of all the floating windows.
  29.  
  30. • void MNewWindow(...)
  31.  
  32. Replaces NewWindow; creates both a floating window and a regular window. (To create a floating window, specify the appropriate window definition ID in the theProc parameter. Currently, the source code expects a procID of 2048 to 2063; this corrisponds to a 'WDEF' resource ID of 128.)
  33.  
  34. • void MNewCWindow(...)
  35.  
  36. Replaces NewCWindow; see MNewWindow above for more information.
  37.  
  38. • void MShowWindow(WindowPtr)
  39.  
  40. Replaces ShowWindow; this shows the specified window. Works with floating windows too.
  41.  
  42. • void MHideWindow(WindowPtr)
  43.  
  44. Replaces HideWindow; this hides the specified window.
  45.  
  46. • void MCloseWindow(WindowPtr)
  47.  
  48. Replaces CloseWindow; this closes the specified window.
  49.  
  50. • void MDisposeWindow(WindowPtr)
  51.  
  52. Replaces DisposeWindow; this closes the specified window.
  53.  
  54. • void MDragWindow(WindowPtr,Point,const Rect *)
  55.  
  56. Replaces DragWindow; works to drag both floating and dialog windows.
  57.  
  58. How do I use it?
  59.  
  60. The Macintosh does not normally come with floating window and palette support, but this is a common trick amongst many applications. This collection of routines makes it easier to add floating window support to your application.
  61.  
  62. To use this library, you need to make the following modifications to your standard MacOS application:
  63.  
  64. 1) Replace the MacOS routines FrontWindow, SelectWindow, NewWindow, NewCWindow, ShowWindow, HideWindow, CloseWindow, DisposeWindow, and DragWindow with the equivalent routines in this library.
  65.  
  66. 2) Change the handling of the inContent event in your event loop to handle both floating windows and document windows.
  67.  
  68. Normally, you would code your handling of the inContent event as:
  69.  
  70. case inContent:
  71.     if (w == FrontWindow()) {
  72.         DoMouseDown(w,e->where,e->modifiers);
  73.     } else {
  74.         SelectWindow(w);
  75.     }
  76.  
  77. what this does is select the specified window w if the window is not frontmost.
  78.  
  79. The thing is, there are now two frontmost windows: the frontmost document window (returned by MFrontWindow), and the frontmost floating window (returned by FrontWindow).
  80.  
  81. So, in order to support this in your inContent event handler code, write:
  82.  
  83. case inContent:
  84.     if (w == FrontWindow()) {
  85.         DoMouseDown(w,e->where,e->modifiers);
  86.     else if (w == MFrontWindow()) {
  87.         DoMouseDown(w,e->where,e->modifiers);
  88.     } else {
  89.         SelectWindow(w);
  90.     }
  91.  
  92. and this will do the trick.
  93.  
  94. 3)  The floating window routines change the value of the windowKind field of the WindowRecord to contain KFloatingWindow (10) if the window is a floating window, and KNormalWindow (11) if the window is a normal (non-floating) window.
  95.  
  96. If you need to use the windowKind field for your own purposes, you need to modify the source code in MacFloater.c to take this into account.
  97.  
  98. The easiest thing to do is to search for all the conditionals containing KFloatingWindow or KNormalWindow (there are 11), and change them to deal with your range of windowKind values. (I would suggest doing something simple, like making all windowKind values between 100 and 300 floating windows.)
  99.  
  100. Note that the MacOS API reserves all windowKind fields less than 8.
  101.  
  102. 4) Rewrite your window activation routine to no longer handle activation/deactivation events from your event loop.
  103.  
  104. In the MacFloater.h file, the routine 'void DoActivate(WindowPtr, short)' is declared, but not defined. This is the routine which the MacFloater.c routines call when a window needs to be activated or deactivated.
  105.  
  106. In your code, you need to do two things. First, you need to comment out the line of code that gets called on receiving an event loop activateEvt message. And second, you need to create a new routine, called DoActivate, which calls your activation routine instead.
  107.  
  108. The arguments to DoActivate are the window to be activated or deactivated, and the second parameter contains 1 if the window is to activate, or 0 if the window is to be deactivated.
  109.  
  110. 5) Recompile and test.
  111.  
  112. Hopefully, this should do the trick without too much pain.
  113.  
  114. If you have any questions, drop me e-mail at woody@alumni.caltech.edu.
  115.  
  116.  
  117. Disclamer:
  118.  
  119. This software is derived from some files on the Develop magazine subscription. I do not recall the copyright notice, though it strikes me that they were freely available for redistribution and use in your own application.
  120.  
  121. Basically, I don't warrant these routines as being fit for anything, even fit for the purpose of wasting hard disk space.
  122.  
  123. Furthermore, I have not copyrighted these files, nor do I intend to do so. Which means they are as free as I can possibly make them--free of any restrictions whatsoever.
  124.  
  125. Anyways, these routines are being made available on the off chance that they may help someone else implement floating window support.
  126.  
  127. If you find any bugs, have any comments or questions, feel free to send them to me at the above address.
  128.  
  129. Thanks, and good luck floating your windows!
  130.  
  131.   Bill Woody
  132.   In Phase Consulting
  133.  
  134.  
  135.